<template>
  <div class="app-container">
    <el-form v-model="searchParams" label-width="100px" :inline="true">
      <el-form-item label="员工工号">
        <el-input v-model="searchParams.staffNo" placeHolder="请输入工号" size="small" clearable/>
      </el-form-item>
      <el-form-item label="是否评估">
        <el-select v-model="searchParams.isAssess" placeholder="请选择状态" clearable size="small">
          <el-option v-for="item in isAssessList"
                     :key="item.code"
                     :label="item.name"
                     :value="item.code"
          ></el-option>
        </el-select>
      </el-form-item>
      <el-form-item style="margin-left: 10px">
        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
        <el-button style="margin-left: 10px" icon="el-icon-refresh" size="mini" @click="reset">重置</el-button>
      </el-form-item>
    </el-form>
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button type="primary" icon="el-icon-confirm" size="mini" :loading="buttonLoading"
                   @click="submitAssess">提交</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button type="primary" icon="el-icon-confirm" size="mini" :loading="buttonLoading"
                   @click="submitAllAssess">全部提交</el-button>
      </el-col>
    </el-row>
    <el-table ref="assessTable" :row-key="getRowKey" :data="showList" v-loading="loading" border
              :span-method="objectSpanMethod"
              @selection-change="handleSelected"
              highlight-current-row>
      <el-table-column type="selection" :reserve-selection="true" width="55" align="center"/>
      <el-table-column label="序号" type="index" align="center"/>
      <el-table-column label="员工工号" prop="staffNo" show-overflow-tooltip/>
      <el-table-column label="员工姓名" prop="employeeName" show-overflow-tooltip/>
      <el-table-column label="部门名称" prop="deptName" show-overflow-tooltip/>
1      <el-table-column label="证书编号" prop="certNumber" show-overflow-tooltip/>
      <el-table-column label="取证日期" prop="obtainEvidenceDate" show-overflow-tooltip/>
      <el-table-column label="是否评估" property="isAssess">
        <template slot-scope="scope">
          <el-radio-group v-model="scope.row.isAssess">
            <el-radio-button :label="'0'">是</el-radio-button>
            <el-radio-button :label="'1'">否</el-radio-button>
          </el-radio-group>
        </template>
      </el-table-column>4
    </el-table>
    <pagination
            v-show="total>0"
            :total="total"
            :page.sync="pageParameter.page"
            :limit.sync="pageParameter.rows"
            @pagination="getList"
    />
    <el-dialog title="分配证书" v-if="open" :visible.sync="open" width="1300px" @close="cancelAssess" append-to-body>
      <allotmentCert ref="allotmentCert" :submittedList="submittedList" :taskId="fakeTaskParams.taskId"
                     :startTime="fakeTaskParams.startTime"  @cancelAssess="cancelAssess"></allotmentCert>
    </el-dialog>
  </div>
</template>

<script>
  import {selectExamAssessInfoById} from '@/api/assess/examAssess'
  import {getuserCode} from "@/utils/userCode";
  import allotmentCert from "@/views/assess/continuous-assessment/form/allotmentCert";
  import {autoRevokeCert} from "@/api/cert/certInfo"

  export default {
    components: {
      allotmentCert
    },
    props: {
      fakeTaskParams: Object
    },
    data() {
      return {
        // 开关
        open: false,
        // 是否评估数据字典
        isAssessList: [],
        // 总条数
        total: 0,
        // 分页参数
        pageParameter: {
          page: 1,
          rows: 10
        },
        // 查询参数
        searchParams: {},
        // 评估总列表
        assessList: [],
        // 条件查询评估列表
        searchAssessList: [],
        // 实际显示数据列表
        showList: [],
        // 已提交数据
        submittedList: [],
        // 吊销列表
        revokeList: [],
        // 复选框选中项
        selected: [],
        // 遮罩层
        loading: false,
        buttonLoading: false,
        // 合并规则对象
        mergeObj: {},
        // 合并的列
        mergeCol: ['staffNo', 'employeeName']
      }
    },
    created() {
      // 初始化是否评估数据字典
      this.getDicts("is_assess").then(response => {
        this.isAssessList = response.responseBody.result
      })
      // 初始化评估信息
      selectExamAssessInfoById({
        assessStatus: '0',
        trainerId: getuserCode()
      }).then(response => {
        this.assessList = response.responseBody
        this.assessList.forEach(item => {
          // 设置是否评估默认值为0，0：评估，1：不评估
          item.isAssess = '0'
        })
        // 初始化显示列表
        this.getList()
      })
    },

    methods: {

      // 获取列表
      getList() {
        this.loading = true
        let page = this.pageParameter.page
        let rows = this.pageParameter.rows
        // 标志，0：用'评估总列表'，1：用'条件查询评估列表'
        let flag = 0;
        for (let key in this.searchParams) {
          if (this.searchParams[key]) {
            flag = 1
          }
        }
        // 根据flag，选择采用对应的列表
        if (flag === 0) {
          // 排序
          this.sortByStaffNo(this.assessList)
          // 分页
          this.showList = this.assessList.slice((page - 1) * rows, page * rows)
          // 初始化合并规则
          this.getSpanArr(this.showList)
          this.total = this.assessList.length
        } else {
          // 排序
          this.sortByStaffNo(this.searchAssessList)
          // 分页
          this.showList = this.searchAssessList.slice((page - 1) * rows, page * rows)
          // 初始化合并规则
          this.getSpanArr(this.showList)
          this.total = this.searchAssessList.length
        }
        this.loading = false
      },

      // 查询
      handleQuery() {
        // 更新条件查询列表
        this.searchAssessList = this.conditionQuery(this.assessList, this.searchParams, Object.keys(this.searchParams).length)
        // 更新显示列表
        this.getList()
      },

      // 重置
      reset() {
        this.searchParams = {}
        this.getList()
      },

      // 处理复选框选中项
      handleSelected(item) {
        this.selected = item
      },

      /**
       * 条件查询
       * list：待查询列表
       * searchParams：查询参数（数据类型：对象）
       * len：查询参数个数
       */
      conditionQuery (list, searchParams, len) {
        if (len === 0) {
          return list
        }
        // 获取最后一个查询参数的key
        let key = Object.keys(searchParams)[len - 1]
        let temp = []
        list.forEach(item => {
          // 将匹配成功的记录保存并用于下一次递归匹配
          if (item[key].indexOf(searchParams[key]) > -1) {
            temp.push(item)
          }
        })
        return this.conditionQuery(temp, searchParams, len - 1)
      },

      // 根据员工工号排序
      sortByStaffNo(list) {
        if (!(list && list.length !== 0)) {
          return
        }
        let i = 1 // 当前需要交换位置下标，从第二个元素开始
        let obj = list[0].staffNo // 当前比较的元素，初值为第一个元素
        let temp // 临时变量
        while (i < list.length) {
          for (let j = i + 1; j < list.length; j++) {
            // 如果找到相等元素则交换位置
            if (obj === list[j].staffNo) {
              temp = list[i]
              list[i] = list[j]
              list[j] = temp
              // 更新交换位置
              i += 1
            }
          }
          // 更新比较元素
          obj = list[i].staffNo
          // 更新交换位置
          i += 1
        }
      },

      // 初始化合并规则
      getSpanArr(list) {
        this.mergeCol.forEach((key) => {
          let count = 0; // 用来记录需要合并行的起始位置
          this.mergeObj[key] = []; // 记录每一列的合并信息
          list.forEach((item, index) => {
            // index == 0表示数据为第一行，直接 push 一个 1
            if (index === 0) {
              this.mergeObj[key].push(1);
            } else {
              // 判断当前行是否与上一行其值相等 如果相等 在 count 记录的位置其值 +1 表示当前行需要合并 并push 一个 0 作为占位
              if (item[key] === list[index - 1][key]) {
                this.mergeObj[key][count] += 1;
                this.mergeObj[key].push(0);
              } else {
                // 如果当前行和上一行其值不相等
                count = index; // 记录当前位置
                this.mergeObj[key].push(1); // 重新push 一个 1
              }
            }
          })
        })
      },

      // 合并规则
      objectSpanMethod({row, column, rowIndex, columnIndex}) {
        // 判断列的属性
        if (this.mergeCol.indexOf(column.property) !== -1) {
          // 判断其值是不是为0
          if (this.mergeObj[column.property][rowIndex]) {
            return [this.mergeObj[column.property][rowIndex], 1]
          } else {
            // 如果为0则为需要合并的行
            return [0, 0];
          }
        }
      },

      // 获取table行主键
      getRowKey (row) {
        return row.id
      },

      // 删除数组指定元素
      remove(arr, item) {
        let index = -1
        for (let i = 0; i < arr.length; i++) {
          if (arr[i] === item) {
            index = i
          }
        }
        if (index > -1) {
          arr.splice(index, 1)
        }
      },

      // 部分提交
      submitAssess() {
        if (this.selected.length === 0) {
          this.$message.error('请先选择需要处理的记录后再提交')
          return
        }
        this.selected.forEach(item => {
          this.submittedList.push(item)
          this.remove(this.assessList, item)
        })
        // 重置复选框选中项
        this.selected.forEach(item => {
          this.$refs.assessTable.toggleRowSelection(item, false)
        })
        this.selected = []

        this.getList()
        // 判断是否所有记录都已处理完
        if (this.assessList.length === 0) {
          this.submitAllAssess()
        }
      },

      // 提交评估信息，进入下一步操作
      submitAllAssess() {
        this.buttonLoading = true
        // 获取持续评估为'否'的记录数，并提示用户
        let count = 0;
        if (this.assessList.length > 0) {
          this.assessList.forEach(item => {
            if (item.isAssess === '1') {
              count++
            }
          })
        }
        if (this.submittedList.length > 0) {
          this.submittedList.forEach(item => {
            if (item.isAssess === '1') {
              count++
            }
          })
        }
        if (count > 0) {
          this.$confirm('提交的消息中有' + count + '条数据未设置为“是”，系统将做吊销处理，确定提交吗？', '警告', {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
          }).then(() => {
            if (this.assessList.length > 0) {
              this.assessList.forEach(item => {
                this.submittedList.push(item)
              })
              this.assessList = []
            }
            // 深度复制
            let tempList = JSON.parse(JSON.stringify(this.submittedList))
            // 清空submittedList
            this.submittedList = []
            // 初始化吊销列表（isAssess：0：评估，1：吊销）
            tempList.forEach(item => {
              if (item.isAssess === '1') {
                // 添加吊销证书id至吊销列表
                this.revokeList.push(item)
              } else {
                // 重新装填评估数据
                this.submittedList.push(item)
              }
            })
            // 吊销
            autoRevokeCert(this.revokeList).then(response => {
              if (response.retCode === '200') {
                this.$message.success('吊销成功')
                // 打开选领导页面
                this.open = true
                this.$message.success("提交成功！")
              } else {
                this.$emit('closeFake')
                this.$message.error('系统自动吊销出错，请联系管理员')
              }
            }).finally(() => {
              this.buttonLoading = false
            })
          }).finally(() => {
            this.buttonLoading = false
          })
        } else {
          if (this.assessList.length > 0) {
            this.assessList.forEach(item => {
              this.submittedList.push(item)
            })
            this.assessList = []
          }
          this.buttonLoading = false
          // 打开选领导页面
          this.open = true
          this.$message.success("提交成功！")
        }
      },

      // 回调
      cancelAssess() {
        this.open = false
        this.$emit('closeFake')
      }
    }
  }
</script>
